using System;
using System.Text.RegularExpressions;
using System.IO;

namespace Update.Utils.Core
{
    /// <summary>
    /// 提供版本相关工具方法的类
    /// </summary>
    public static class VersionHelper
    {
        /// <summary>
        /// 默认的版本文件正则表达式，匹配任意文件名前缀，后跟版本号（x.y.z），扩展名为.zip
        /// </summary>
        private static readonly string DefaultVersionFilePattern = @"(.+)[-_](\d+\.\d+\.\d+)\.zip";

        /// <summary>
        /// 从文件名中提取版本号
        /// </summary>
        /// <param name="filename">文件名</param>
        /// <returns>版本号，如果未找到则返回null</returns>
        public static string ExtractVersionFromFilename(string filename)
        {
            return ExtractVersionFromFilename(filename, DefaultVersionFilePattern);
        }

        /// <summary>
        /// 使用指定的正则表达式从文件名中提取版本号
        /// </summary>
        /// <param name="filename">文件名</param>
        /// <param name="pattern">正则表达式模式，第二个捕获组应该是版本号</param>
        /// <returns>版本号，如果未找到则返回null</returns>
        public static string ExtractVersionFromFilename(string filename, string pattern)
        {
            if (string.IsNullOrEmpty(filename))
                return null;
                
            try
            {
                var match = Regex.Match(filename, pattern);
                if (match.Success && match.Groups.Count >= 3) // 至少需要3个组：整个匹配、文件名前缀、版本号
                {
                    return match.Groups[2].Value; // 版本号在第2个捕获组
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"提取版本号时发生错误: {ex.Message}");
            }
            
            return null;
        }

        /// <summary>
        /// 从文件路径中提取版本号
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <returns>版本号，如果未找到则返回null</returns>
        public static string ExtractVersionFromFilePath(string filePath)
        {
            if (string.IsNullOrEmpty(filePath))
                return null;
                
            try
            {
                string filename = Path.GetFileName(filePath);
                return ExtractVersionFromFilename(filename);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"从文件路径提取版本号时发生错误: {ex.Message}");
                return null;
            }
        }

        /// <summary>
        /// 比较两个版本号
        /// </summary>
        /// <param name="version1">版本号1</param>
        /// <param name="version2">版本号2</param>
        /// <returns>
        /// 如果version1 > version2，返回 1
        /// 如果version1 = version2，返回 0
        /// 如果version1 < version2，返回 -1
        /// </returns>
        public static int CompareVersions(string version1, string version2)
        {
            // 如果任一版本为空，则认为另一个版本更高
            if (string.IsNullOrEmpty(version1) && string.IsNullOrEmpty(version2))
                return 0;
            if (string.IsNullOrEmpty(version1))
                return -1;
            if (string.IsNullOrEmpty(version2))
                return 1;
                
            try
            {
                // 分割版本号
                string[] v1Parts = version1.Split('.');
                string[] v2Parts = version2.Split('.');
                
                // 比较每个部分
                int length = Math.Max(v1Parts.Length, v2Parts.Length);
                for (int i = 0; i < length; i++)
                {
                    int num1 = i < v1Parts.Length ? int.Parse(v1Parts[i]) : 0;
                    int num2 = i < v2Parts.Length ? int.Parse(v2Parts[i]) : 0;
                    
                    if (num1 > num2) return 1;
                    if (num1 < num2) return -1;
                }
                
                return 0;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"比较版本号时发生错误: {ex.Message}");
                // 如果解析出错，直接比较字符串
                return string.Compare(version1, version2);
            }
        }

        /// <summary>
        /// 检查第一个版本是否高于第二个版本
        /// </summary>
        /// <param name="version1">版本号1</param>
        /// <param name="version2">版本号2</param>
        /// <returns>如果version1 > version2，返回true，否则返回false</returns>
        public static bool IsNewerVersion(string version1, string version2)
        {
            return CompareVersions(version1, version2) > 0;
        }

        /// <summary>
        /// 从目录中找到最新版本的文件
        /// </summary>
        /// <param name="directoryPath">目录路径</param>
        /// <param name="searchPattern">搜索模式，例如"*.zip"</param>
        /// <returns>最新版本的文件路径，如果未找到则返回null</returns>
        public static string FindLatestVersionFile(string directoryPath, string searchPattern = "*.zip")
        {
            try
            {
                if (!Directory.Exists(directoryPath))
                    return null;
                    
                string[] files = Directory.GetFiles(directoryPath, searchPattern);
                if (files.Length == 0)
                    return null;
                    
                string latestFile = null;
                string latestVersion = null;
                
                foreach (string file in files)
                {
                    string version = ExtractVersionFromFilePath(file);
                    if (!string.IsNullOrEmpty(version))
                    {
                        if (latestVersion == null || IsNewerVersion(version, latestVersion))
                        {
                            latestVersion = version;
                            latestFile = file;
                        }
                    }
                }
                
                return latestFile;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"查找最新版本文件时发生错误: {ex.Message}");
                return null;
            }
        }
    }
} 